#include <Python.h>
#include <cstdio>
#include <iostream>
#include <unistd.h>

void logd(const char* fmt, ...) {

    // time
    time_t now = time(nullptr);
    struct tm* tm = localtime(&now);
    printf("%04d-%02d-%02d %02d:%02d:%02d ",
        tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
        tm->tm_hour, tm->tm_min, tm->tm_sec);

    printf("[D] ");

    if (fmt == nullptr) {
        printf("\n");
        return;
    }

    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
}

// 1. C++函数暴露给Python
static PyObject* cpp_add(PyObject* self, PyObject* args) {
    logd("cpp_add called\n");

    int a, b;
    if (!PyArg_ParseTuple(args, "ii", &a, &b)) 
        return nullptr;
    return PyLong_FromLong(a + b);
}

// 2. 模块方法表
static PyMethodDef script_module_methods[] = {
    {"cpp_add", cpp_add, METH_VARARGS, "Add two ints in C++"},
    {nullptr, nullptr, 0, nullptr}
};

// 3. 模块定义
static struct PyModuleDef script_module = {
    .m_base = PyModuleDef_HEAD_INIT,
    .m_name = "script", 
    .m_doc = "script module", 
    .m_size = -1, 
    .m_methods = script_module_methods, // 方法表

};

// 4. 模块初始化函数（必须导出）
PyMODINIT_FUNC PyInit_my_module() {
    return PyModule_Create(&script_module);
}

int main(int argc, char* argv[]) {
    logd("当前目录: %s\n", getcwd(NULL, 0));

    // 初始化Python
    Py_Initialize();

    // 手动加载模块（替代import）
    PyObject* pModule = PyInit_my_module();
    PyDict_SetItemString(PyImport_GetModuleDict(), "script", pModule);

    // 执行Python代码
    {
        FILE* fp = fopen("script.py", "r");
        if (!fp) {
            perror("无法打开文件");
            return 1;
        }
        int ret = PyRun_SimpleFile(fp, "script.py");
        fclose(fp);
    
        if (ret != 0) {
            PyErr_Print();  // 打印Python错误
        }
    }

    // 清理
    Py_Finalize();
    return 0;
}
